In today's data processing environment, it is often desirable to maintain more than one copy of data. Maintaining multiple copies of data increases the availability of the data, and decreases the possibility that data will be lost due to memory failure, disk failure, or other hardware problems.
One method used to maintain multiple copies of data is known as mirroring. Mirroring is a form of RAID (Redundant Array of Independent Disks), and is often referred to as RAID-1. Mirroring is implemented by storing two or more copies of data on two or more different disks. Data may be read from any of the disks on which it is stored, so long as the disk is available.
In a typical information handling system, each fixed-disk drive is referred to as a physical volume, and has a unique name. Each physical volume in use belongs to a volume group. The physical volumes within a volume group are divided into physical partitions of the same size. Within each volume group, one or more logical volumes may be defined. Data on a logical volume appears to be contiguous to a user, but is usually discontiguous on the physical volume. Each logical volume is divided into one or more logical partitions, where each logical partition corresponds to one or more physical partitions. To implement mirroring, additional physical partitions are used to store the additional copies of each logical partition.
Two types of scheduling policies, known as parallel mirroring and sequential mirroring, may be implemented in a mirrored system. In parallel mirroring, a write request is broadcast to all mirrored disks within a logical volume, and data is written to each of the mirrored disks. When a read request is received, the requested data is read from the disk whose disk head is considered physically closest to the address location of the requested data. In sequential mirroring, one mirror (i.e. disk) is designated as the primary mirror, and the remaining mirrors (i.e. disks) are designated as secondary mirrors. When a read request is received in a sequentially mirrored system, the data is read from the primary mirror. When a write request is received, the data is written to the primary mirror first, and then to each of the secondary mirrors.
When a logical volume is defined, a scheduling policy (i.e. the type of mirroring, either parallel or sequential, and the primary mirror if necessary), is defined by a logical volume manager. The scheduling policy can not typically be changed without halting the operation of the logical volume and re-defining the scheduling policy.
It is often undesirable to handle every I/O request using the same scheduling policy. System performance can degrade due to bus and disk contention when every I/O operation from every process (i.e. application) is requesting access to the same primary mirror. Further, for write operations, parallel mirroring is usually more efficient, while sequential mirroring usually insures that an application can determine which mirror contains the latest copy of data in the event of a system crash.
A prior art method for swapping the primary and secondary mirrors in an error situation is discussed in IBM Technical Disclosure Bulletin Vol. 36, No. 12 (December 1993). However, the swap is made based upon an error being detected by the system, and once the swap has been made, the newly designated primary mirror becomes the primary mirror for all users and all I/O requests from that point on. The prior art does not teach or suggest a method for dynamically specifying I/O attributes, such as use of a primary mirror or type of scheduling, for a single I/O request or for a group of I/O requests.
Consequently, it would be desirable to have a system and method for dynamically specifying I/O attributes for a single I/O operation, or for groups of I/O operations. It would also be desirable to be able to dynamically specify a scheduling policy, such as a primary mirror and scheduling type, for all applications without having to halt operation of a logical volume. It would be further desirable to complete an I/O operation using an alternate or default attribute if a dynamically requested I/O attribute is not available.